#pragma once
#include "Actor.h"
#include "CAgitMapRes.hpp"
#include "Character.h"
#include "HostPathFinder.h"
#include "NetLib/MemoryMgr.h"
#include "CNPCSkill.hpp"
#include "CNPCStateUpdater.hpp"
#include "CNPCUpdater.hpp"
#include "PollTimer.h"
#include "globals.hpp"
#include "struct.hpp"
#include "std/list"
#include "std/map"
#include "std/vector"
struct PACKET_CZ_REQUEST_MOVE;
struct CollideInfo;


class CNPC : public CActor
{
public:
	struct vtable_t // const CNPC::`vftable'
	{
		void* (CNPC::* scalar_deleting_destructor)(unsigned int flags);
		int (CCharacter::* GetType)(void);
		void (CCharacter::* AddErrorCount)(const char* filename, int line, DWORD count, DWORD time);
		void (CCharacter::* AddErrorCount2)(DWORD count, DWORD time);
		void (CNPC::* Init)(void);
		int (CCharacter::* GetWeaponProperty)(int position, int isArrowProperty);
		bool (CCharacter::* IsActor)(void);
		int (CCharacter::* IsItPossible)(int property);
		int (CNPC::* IsSiegeMode)(void);
		unsigned long (CNPC::* GetAccountID)(void);
		
		int (CNPC::* OnMsg)(CCharacter* sender, CCharacter* receiver, unsigned long msgID, int par1, int par2, int par3, MSGpar::CVar par4);
		int (CNPC::* GetParameterValue)(unsigned short id, int& value);
		int (CNPC::* UpdateParameterValue)(unsigned short id, int value);
		void (CNPC::* InsertCommand)(COMMAND_QUEUE* command);
		void (CNPC::* CheckCommandQueue)(void);
		void (CNPC::* DisableCommand)(unsigned long commandID);
		COMMAND_QUEUE* (CNPC::* SearchCommand)(unsigned long commandID);
		int (CNPC::* IsMyArea)(CCharacter* ch, int range);
		unsigned long (CNPC::* GetState)(void);
		int (CNPC::* GetScale)(void);

		int (CNPC::* IsTarget)(CCharacter* ch, unsigned long flag);
		int (CNPC::* IsDamageMotionPossible)(void);
		int (CNPC::* IsRightProperty)(int property);
		int (CNPC::* IsAvoidable)(int race, int _class, int level);
		int (CCharacter::* IsInitingState)(void);
		int (CCharacter::* IsLucky)(void);
		void (CNPC::* OnShowEffect)(int effect);
		void (CNPC::* OnShowEffect3)(int effect, int numdata);
		int (CNPC::* GetEffectState)(void);
		void (CNPC::* OnMsgFromItemServer)(unsigned long in_loc, CITZMsg* flag);

		void (CCharacter::* ReduceSPByUseSkill)(int sp);
		bool (CCharacter::* IsExistItem)(int itemID, int count, bool isExternalEffect);
		bool (CCharacter::* ConsumeItemByUseSkill)(int itemID, int count, bool isExternalEffect);
		short (CNPC::* GetAttackSuccessPercent)(CCharacter* other, int isRangeAttack);
		int (CNPC::* GetAttackFinalDamage)(ATTACK_INFO* info);
		int (CNPC::* SkillAttack)(SKILLATTACK_MSG* msg, int plusATTPowerPercent, int plusATTSuccessPercent, const bool in_bHideSkill);
		short (CNPC::* SplashAttack)(int val1, short xPos, short yPos, int type, int range, int rangeIn, unsigned long exceptAID, void* msgDataPtr, int val2, int count);
		int (CNPC::* SplashAttack2)(int plusATTPower, PosInfo dest, int type, int halfWidth, int height, MSG_TYPE1_TWODWORD* msgData, int count, int plusHitPercent, PosInfo* specialSrc);
		int (CNPC::* SetHandicapState)(int state, CCharacter* other, int percent, int preDelayTime, int delayTime, int isSpell, int isFixedDelayTime);
		int (CCharacter::* GetModifiedTargetItemDEF)(CCharacter* target);

		int (CCharacter::* GetModifiedTargetItemMDEF)(CCharacter* target);
		int (CNPC::* SetEffective)(int index, int time, int val1, int val2, int val3, int isSendClient);
		int (CCharacter::* GetEffective)(int index, int enumVal);
		void (CCharacter::* UpdateEffective)(int index, int val, int enumVal);
		void (CNPC::* ResetEffective)(int index, int val);
		bool (CCharacter::* IsEnableSetEffective)(int index, int time, int val);
		bool (CNPC::* IsGroundEffective)(int index, int& SKID, bool& isPlaySolo);
		void (CNPC::* ProcessGroundEffective)(int par1, int par2, bool par3);
		void (CCharacter::* ProcessCheckEffective)(int index, EFFECTIVE_INFO* info);
		void (CNPC::* SetOnShowEFST)(int value);

		void (CNPC::* SetOffShowEFST)(int value);
		void (CNPC::* OnChangeStatusAmount)(int SKID, unsigned short type, unsigned long time, int amount);
		void (CNPC::* NotifyStatusAmount)(unsigned short type, int amount);
		char (CNPC::* GetCampID)(void);
		void (CNPC::* SetCampID)(char campID);
		const char* (CNPC::* GetNamePtr)(void);
		short (CNPC::* GetHealthState)(void);
		void (CNPC::* ResetHealthState)(short state);
		void (CNPC::* SetEffectStateTimeInfo)(unsigned long time, int state);
		void (CNPC::* ResetEffectState)(int state);

		void (CNPC::* SetEffectState)(int state);
		void (CNPC::* Reset)(void);
		void (CNPC::* OnDead)(unsigned long killer);
		void (CNPC::* Send)(const int in_Length, char* in_pBuffer);
		void (CNPC::* SkillUseAck)(unsigned short SKID, unsigned short NUM, bool result, unsigned char cause);
		void (CNPC::* OnProcess)(void);
		int (CNPC::* GetAttackPoint)(CCharacter* other, unsigned short SKID, int property);
		int (CNPC::* GetSpeed)(void);
		int (CNPC::* GetAvoidableSuccessPercent)(void);
		short (CNPC::* GetStatusDef)(void);

		short (CNPC::* GetDefencePoint)(void);
		int (CNPC::* GetModifiedValueByEnemySize)(int value);
		short (CNPC::* GetItemMagicDef)(void);
		short (CNPC::* GetStatusMagicDef)(void);
		int (CNPC::* GetMaxHP)(void);
		int (CNPC::* GetMaxSP)(void);
		short (CNPC::* GetDexValue)(void);
		short (CNPC::* GetIntValue)(void);
		int (CNPC::* IsRechargeTime)(void);
		void (CNPC::* ModifyAttackPowerByEffective)(CCharacter* ch, int attackProperty, int& damage);

		int (CNPC::* GetSKLevel)(const int in_SKID);
		bool (CNPC::* OpSKToChar_SKID_ML_DEVOTION)(CCharacter* in_TargetCH, MSG_TYPE4_FIVEDWORD* in_pData);
		void (CNPC::* OpSKToSelf_SKID_ML_DEFENDER)(const int in_SKlevel);
		void (CNPC::* OpSKToSelf_SKID_MER_MAGNIFICAT)(const int in_SKLevel, const int in_EFST, const int in_EFST_time, const int in_EFST_value);
		void (CNPC::* OpSKToSelf_SKID_MER_AUTOBERSERK)(void);
		void (CNPC::* NotifyParameter)(unsigned short type, int count);
		void (CNPC::* ResetEffective_after_EFST_DEFENDER)(void);
		int (CNPC::* GetEmblemVersion)(void);
		bool (CNPC::* ApplyStatusAmount)(unsigned short type, int& amount);
		int (CNPC::* GetModifiedTargetStatusDEF)(CCharacter* target);

		void (CNPC::* ApplyExtraDEF)(int& def, CCharacter* in_cpAtkerCH);
		void (CNPC::* ApplyExtraMDEF)(int& mdef);
		void (CNPC::* InitCore)(void);
		int (CNPC::* GetMagicAttPower)(void);
		short (CNPC::* GetAvoidPercent_Client)(void);
	};

	class Neighbor
	{
		/* this+0 */ public: mystd::vector<CCharacter*> * m_pSectionList;
		/* this+4 */ public: CCharacter* m_pCharacter;

		public: Neighbor::Neighbor(CCharacter* in_pCharacter, mystd::vector<CCharacter *>* in_pSectionList)
		{
			m_pCharacter = in_pCharacter;
			m_pSectionList = in_pSectionList;
		}
	};

	enum enumATTRMASK
	{
		ATTRMASK_MUST_DAMAGE_ONE_DIRECTATK = 0x1,
		ATTRMASK_MUST_DAMAGE_ONE_SPELLATK  = 0x2,
		ATTRMASK_MUST_DAMAGE_ONE_RNGATK    = 0x4,
	};

	/* this+   0 */ public: //CActor baseclass_0;
	/* this+ 356 */ protected: NpcTimeInfo m_characterTimeInfo;
	/* this+ 416 */ protected: CNPCSkill m_npcSkill;
	/* this+ 516 */ protected: mystd::list<EATING_ITEM_INVENTORY*> m_eatingItem;
	/* this+ 528 */ protected: CMemoryMgr<EATING_ITEM_INVENTORY> m_eatingItemMPool;
	/* this+ 576 */ protected: CHostPathInfo m_pathInfo;
	/* this+ 632 */ protected: CNPCUpdater m_npcUpdater;
	/* this+ 652 */ protected: unsigned long m_currentState;
	/* this+ 656 */ protected: unsigned long m_myParentAID;
	/* this+ 660 */ protected: int m_isSkilledFromCrucis;
	/* this+ 664 */ protected: int m_isFSMDependent;
	/* this+ 668 */ protected: int m_asDelta;
	/* this+ 672 */ protected: mystd::list<MYMOBDATA> m_myMobList;
	/* this+ 684 */ protected: mystd::map<int,AMOUNT_INFO> m_ATKPercentList;
	/* this+ 696 */ protected: mystd::map<int,AMOUNT_INFO> m_DEFPercentList;
	/* this+ 708 */ protected: mystd::map<int,AMOUNT_INFO> m_MATKPercentList;
	/* this+ 720 */ protected: mystd::map<int,AMOUNT_INFO> m_MDEFPercentList;
	/* this+ 732 */ protected: int m_isMagicLocked;
	/* this+ 736 */ protected: int m_isRangeAttacked;
	/* this+ 740 */ protected: int m_isRudeAttacked;
	/* this+ 744 */ protected: unsigned long m_attackedSkillID;
	/* this+ 748 */ protected: mystd::map<unsigned long,unsigned long> m_invincibleInfo;
	/* this+ 760 */ protected: NpcInfo m_characterInfo;
	/* this+1068 */ protected: CNPCStateUpdater m_npcStateUpdater;
	/* this+1108 */ protected: unsigned char m_npcType;
	/* this+1112 */ protected: CPollTimer m_emoticonTM;
	/* this+1120 */ protected: mystd::list<unsigned long> m_specialZoneList;

	public: CNPC::CNPC(void);
	public: virtual CNPC::~CNPC(void);
	public: int CNPC::GetJobType(void);
	//public: unsigned long CNPC::GetMyCreatorPCAID(void);
	public: virtual void CNPC::Init(void);
	public: void CNPC::InitTimeInfo(void);
	public: unsigned char CNPC::GetNPCType(void);
	public: void CNPC::NotifySkillAction(CCharacter* sender, CCharacter* attacker, CCharacter* target, int damage, short count, short level, unsigned short SKID);
	public: virtual int CNPC::IsSiegeMode(void);
	public: virtual unsigned long CNPC::GetAccountID(void);
	public: virtual int CNPC::OnMsg(CCharacter* sender, CCharacter* receiver, unsigned long msgID, int par1, int par2, int par3, MSGpar::CVar par4);
	public: virtual int CNPC::GetParameterValue(unsigned short id, int& value);
	public: virtual int CNPC::UpdateParameterValue(unsigned short id, int value);
	public: virtual void CNPC::InsertCommand(COMMAND_QUEUE* command);
	public: virtual void CNPC::CheckCommandQueue(void);
	public: virtual void CNPC::DisableCommand(unsigned long commandID);
	public: virtual COMMAND_QUEUE* CNPC::SearchCommand(unsigned long commandID);
	public: virtual int CNPC::IsMyArea(CCharacter* ch, int range);
	public: virtual unsigned long CNPC::GetState(void);
	public: virtual int CNPC::GetScale(void);
	public: virtual int CNPC::IsTarget(CCharacter* ch, unsigned long flag);
	public: int CNPC::GetErrorCount(void);
	public: void CNPC::SetErrorCount(int i);
	public: virtual int CNPC::IsDamageMotionPossible(void);
	public: virtual int CNPC::IsRightProperty(int property);
	public: int CNPC::IsMovable(void);
	public: int CNPC::IsAttackable(void);
	public: virtual int CNPC::IsAvoidable(int race, int _class, int level);
	protected: virtual void CNPC::OnShowEffect(int effect);
	protected: virtual void CNPC::OnShowEffect3(int effect, int numdata);
	protected: virtual int CNPC::GetEffectState(void);
	public: virtual void CNPC::OnMsgFromItemServer(unsigned long in_loc, CITZMsg* flag);
	public: virtual short CNPC::GetAttackSuccessPercent(CCharacter* other, int isRangeAttack);
	protected: int CNPC::GetAttackFinalDamage(CCharacter* other, int plusATKPercent, int plusHITPercent, unsigned short SKID, int SKProperty, int isRNGATK);
   	public: virtual int CNPC::GetAttackFinalDamage(ATTACK_INFO* info);
	protected: virtual int CNPC::SkillAttack(SKILLATTACK_MSG* msg, int plusATTPowerPercent, int plusATTSuccessPercent, const bool in_bHideSkill);
	public: virtual short CNPC::SplashAttack(int val1, short xPos, short yPos, int type, int range, int rangeIn, unsigned long exceptAID, void* msgDataPtr, int val2, int count);
	public: virtual int CNPC::SplashAttack2(int plusATTPower, PosInfo dest, int type, int halfWidth, int height, MSG_TYPE1_TWODWORD* msgData, int count, int plusHitPercent, PosInfo* specialSrc);
	public: virtual int CNPC::SetHandicapState(int state, CCharacter* other, int percent, int preDelayTime, int delayTime, int isSpell, int isFixedDelayTime);
	public: virtual int CNPC::SetEffective(int index, int time, int val1, int val2, int val3, int isSendClient);
	public: virtual void CNPC::ResetEffective(int index, int val);
	public: virtual bool CNPC::IsGroundEffective(int index, int& SKID, bool& isPlaySolo);
	public: virtual void CNPC::ProcessGroundEffective(int par1, int par2, bool par3);
	public: virtual void CNPC::SetOnShowEFST(int value);
	public: virtual void CNPC::SetOffShowEFST(int value);
	public: virtual void CNPC::OnChangeStatusAmount(int SKID, unsigned short type, unsigned long time, int amount);
	public: virtual void CNPC::NotifyStatusAmount(unsigned short type, int amount);
	public: virtual char CNPC::GetCampID(void);
	public: virtual void CNPC::SetCampID(char campID);
	public: virtual const char* CNPC::GetNamePtr(void);
	public: virtual short CNPC::GetHealthState(void);
	public: virtual void CNPC::ResetHealthState(short state);
	public: virtual void CNPC::SetEffectStateTimeInfo(unsigned long time, int state);
	public: virtual void CNPC::ResetEffectState(int state);
	public: virtual void CNPC::SetEffectState(int state);
	public: virtual void CNPC::Reset(void);
	public: virtual void CNPC::OnDead(unsigned long killer);
	public: virtual void CNPC::Send(const int in_Length, char* in_pBuffer);
	public: virtual void CNPC::SkillUseAck(unsigned short SKID, unsigned short NUM, bool result, unsigned char cause);
	public: virtual void CNPC::OnProcess(void);
	public: virtual int CNPC::GetAttackPoint(CCharacter* other, unsigned short SKID, int property);
	public: virtual int CNPC::GetSpeed(void);
	public: virtual int CNPC::GetAvoidableSuccessPercent(void);
	public: virtual short CNPC::GetStatusDef(void);
	public: virtual short CNPC::GetDefencePoint(void);
	public: virtual int CNPC::GetModifiedValueByEnemySize(int value);
	public: virtual short CNPC::GetItemMagicDef(void);
	public: virtual short CNPC::GetStatusMagicDef(void);
	public: virtual int CNPC::GetMaxHP(void);
	public: virtual int CNPC::GetMaxSP(void);
	public: virtual short CNPC::GetDexValue(void);
	public: virtual short CNPC::GetIntValue(void);
	public: virtual int CNPC::IsRechargeTime(void);
	public: virtual void CNPC::ModifyAttackPowerByEffective(CCharacter* ch, int attackProperty, int& damage);
	public: unsigned short CNPC::GetLostItem(int percent);
	public: int CNPC::GetATKHasteVal1(void);
	public: int CNPC::GetATKHasteVal2(void);
	public: int CNPC::GetAttackSlowValue(void);
	public: int CNPC::GetMoveHasteValue(void);
	public: int CNPC::GetMoveSlowValue(void);
	public: void CNPC::SetParentAID(unsigned long AID);
	public: unsigned long CNPC::GetParentAID(void);
	public: void CNPC::SetRegen(int flag);
	public: int CNPC::IsRegen(void);
	public: char* CNPC::GetAccountName(void);
	public: short CNPC::GetAttackRange(void);
	public: int CNPC::GetRevivalTerm(void);
	public: int CNPC::GetAttackMotionTime(void);
	public: int CNPC::GetAttackedMotionTime(void);
	public: int CNPC::IsCritical(void);
	public: NpcInfo* CNPC::GetCharacterInfo(void);
	public: unsigned long CNPC::GetCurrentFSMState(void);
	public: void CNPC::SetCurrentFSMState(unsigned long state);
	public: void CNPC::OnUseSkill(unsigned short SKID, int skLevel, int targetAID, int xPos, int yPos);
	public: CCharacter* CNPC::GetTarget(void);
	public: void CNPC::SetFSMDependent(int flag);
	public: int CNPC::IsFSMDependent(void);
	public: void CNPC::StopMove(void);
	public: int CNPC::IsMovableAround(int range);
	public: unsigned long CNPC::GetEnemyAID(void);
	public: void CNPC::SetEnemyAID(unsigned long AID);
	public: void CNPC::SetBodyState(short state);
	public: void CNPC::SetHealthState(short state);
	public: void CNPC::SetCurrentState(short state);
	public: void CNPC::SetSpeed(int speed);
	public: void CNPC::SetZenyLost(void);
	public: int CNPC::IsZenyLost(void);
	public: int CNPC::InitByPacket(void* p);
	public: int CNPC::SetAccountID(int AID);
	public: bool CNPC::RegistBattleFiledNpc(const char* map_name);
	public: int CNPC::GetBattleFieldAliveMemberCount(const char camp_code);
	public: void CNPC::KVM_StartAliveCheck(void);
	public: void CNPC::KVM_Npc_Noti(const char* sw);
	public: void CNPC::InitSkill(void);
	public: void CNPC::Dump(int closeType, int killer);
	public: void CNPC::OnEmotion(int type);
	public: void CNPC::ChangeSprite(unsigned long sprite);
	public: int CNPC::IsSameGuild(int GuildID);
	public: void CNPC::Revival(void);
	public: void CNPC::CancelNPCSkill(void);
	public: void CNPC::SetRangedAttacked(bool value, unsigned long id);
	public: void CNPC::SetRudeAttacked(bool value, unsigned long id);
	public: void CNPC::SetAttackedSkillID(unsigned long skillID);
	public: void CNPC::OnTeleportCharacter(int par1, int par2, int par3);
	public: void CNPC::OnGroundSkill(int SKID, int tarAID, int SKInfo);
	public: void CNPC::OnTouchedSkillObject(int tarAID, int SKInfo, int par1);
	public: void CNPC::OperationSkillToCharacter(int SKID, int tarAID, int SKInfo);
	public: void CNPC::SPAttackSkillToCharacter(int SKID, int tarAID, int SKInfo);
	public: void CNPC::OperationSkillToSelf(int SKID, int tarAID, int SKInfo);
	public: void CNPC::SplashAttack3(int plusATTPower, PosInfo dest, int type, MSG_TYPE1_TWODWORD* msgData, int range, int count);
	public: void CNPC::SplashNapalmBeat(SKILLATTACK_MSG* msg, short xPos, short yPos, int range, unsigned long exceptID);
	public: void CNPC::GetPushedPosition2(int xPos, int yPos, int destDir, int distance, PosInfo& result);
	public: void CNPC::GetSplashCells(PosInfo src, PosInfo dest, int halfWidth, int height, PosInfo* result);
	public: void CNPC::GetSplashCells2(PosInfo src, PosInfo dest, int height, PosInfo* result);
	public: int CNPC::GetFireWallNeighborCells(short srcX, short srcY, int desX, int desY, int* result);
	public: void CNPC::NotifyUseSkill(unsigned short SKID, unsigned long targetAID, unsigned long srcAID, short level, bool result);
	public: void CNPC::NotifyGroundSkillUsing(unsigned short SKID, short level, short xPos, short yPos, unsigned long startTime);
	public: void CNPC::DetectHidingCharacter(int range, SKILLATTACK_MSG* msg, int plusAttPower, int deltaX, int deltaY);
	public: void CNPC::SummonMonster(SummonMobList* summonMobList, unsigned short skillID, int slaveFlag, int posFlag);
	public: void CNPC::Metamorphosis(SummonMobList* summonMobList);
	public: CCharacter* CNPC::AddMonster(unsigned long spriteType, int slaveFlag, int posFlag);
	public: void CNPC::ModifyDamage(int& damage, int isRangeAttack, int attackType, CCharacter* other, unsigned short SKID);
	public: void CNPC::ModifyDamage_ATKED(CCharacter* other, int& damage, int isRNGATK, int type, int property, int SKID);
	public: void CNPC::NotifyMissSkill(unsigned short SKID, unsigned long targetAID, unsigned long srcAID, int damage);
	public: void CNPC::NeighborPCAttack(int val1, short xPos, short yPos, int type, int range, int rangeIn, unsigned long exceptAID, MSG_TYPE1_TWODWORD* msgData, int val2, int count);
	//public: int CNPC::GetMagicAttackModifiedPower(CCharacter*, int, int, unsigned short, int);
	public: void CNPC::Enable(void);
	public: void CNPC::Disable(void);
	public: int CNPC::IsEnable(void);
	public: void CNPC::OnChangeDefense(int defense, int isInit);
	public: int CNPC::SetParameter(void);
	public: void CNPC::InitCache(void);
	public: void CNPC::OnChangeGuildID(void);
	public: void CNPC::SetATKPercentInfo(int SKID, unsigned long time, int val);
	public: void CNPC::SetDEFPercentInfo(int SKID, unsigned long time, int val);
	public: void CNPC::ResetATKPercentInfo(int SKID);
	public: void CNPC::ResetDEFPercentInfo(int SKID);
	public: void CNPC::SetMATKPercentInfo(int SKID, unsigned long time, int val);
	public: void CNPC::SetMDEFPercentInfo(int SKID, unsigned long time, int val);
	public: void CNPC::ResetMATKPercentInfo(int SKID);
	public: void CNPC::ResetMDEFPercentInfo(int SKID);
	public: unsigned short CNPC::GetSpellCasting(void);
	public: int CNPC::OnWhereMyMob_XPos(const char* mobName);
	public: int CNPC::OnWhereMyMob_YPos(const char* mobName);
	public: unsigned long CNPC::FindMyMobAID(const char* mobName);
	public: void CNPC::SetSpellCasting(const unsigned short in_SKID);
	public: virtual int CNPC::GetSKLevel(const int in_SKID);
	public: virtual bool CNPC::OpSKToChar_SKID_ML_DEVOTION(CCharacter* in_TargetCH, MSG_TYPE4_FIVEDWORD* in_pData);
	public: virtual void CNPC::OpSKToSelf_SKID_ML_DEFENDER(const int in_SKlevel);
	public: virtual void CNPC::OpSKToSelf_SKID_MER_MAGNIFICAT(const int in_SKLevel, const int in_EFST, const int in_EFST_time, const int in_EFST_value);
	public: virtual void CNPC::OpSKToSelf_SKID_MER_AUTOBERSERK(void);
	public: virtual void CNPC::NotifyParameter(unsigned short type, int count);
	public: virtual void CNPC::ResetEffective_after_EFST_DEFENDER(void);
	protected: void CNPC::CollideSplashAttack(const int in_plusATTPower, const CCharacter* in_srcCH, const CCharacter* in_otherCH, const int in_destDir, const unsigned short in_SKID, const int in_DistCellFactor, mystd::map<CCharacter *,CollideInfo>& io_collidedList);
	//private: void CNPC::DispatchCommand(COMMAND_QUEUE*);
	private: void CNPC::OnUseGroundSkill(int SKID, MSG_TYPE1_TWODWORD* position, int skLevel, int spCost);
	public: virtual int CNPC::GetEmblemVersion(void);
	public: unsigned long CNPC::GetNeighborPcNumber(int range);
	public: void CNPC::CheckSpecialState(unsigned long tick);
	public: void CNPC::CheckCondition(unsigned long tick);
	public: CItem* CNPC::CreateItemOnMap(unsigned short itmID, int count, int x, int y);
	public: void CNPC::AddSpecialZoneList(unsigned long AID);
	public: void CNPC::DelSpecialZoneList(void);
	public: virtual bool CNPC::ApplyStatusAmount(unsigned short type, int& amount);
	public: short CNPC::GetBodyState(void);
	public: void CNPC::Chat(const char* buf, unsigned long color);
	public: short CNPC::GetAttSucPercent(void);
	public: virtual int CNPC::GetModifiedTargetStatusDEF(CCharacter* target);
	public: virtual void CNPC::ApplyExtraDEF(int& def, CCharacter* in_cpAtkerCH);
	public: virtual void CNPC::ApplyExtraMDEF(int& mdef);
	public: int CNPC::GetMinusStdPropertyDamage(CCharacter* atker, int damage, unsigned short SKID, int property);
	public: int CNPC::GetRoomSize(void);
	protected: virtual void CNPC::InitCore(void);
	protected: void CNPC::AddMYMob(unsigned long AID);
	protected: void CNPC::OnMyMonsterDead(unsigned long AID, unsigned long killer);
	protected: int CNPC::StartPath(PACKET_CZ_REQUEST_MOVE* pReq, unsigned long startTime);
	protected: int CNPC::OnMove(PACKET_CZ_REQUEST_MOVE* p);
	protected: void CNPC::MultiCastStateInfo(void);
	protected: void CNPC::NotifyInfoToSection(void);
	protected: short CNPC::GetCurrentState(void);
	protected: int CNPC::GetMYMobSize(void);
	protected: int CNPC::SpawnMyMob(unsigned long spriteType);
	protected: void CNPC::OnResetMyMob(void);
	protected: void CNPC::UseSkillToCharacter(int SKID, int tarAID, int SKInfo);
	protected: int CNPC::GetMagicAttackFinalDamage(CCharacter* other, int plusATTPowerPercent, int plusATTSuccessPercent, unsigned short SKID);
	protected: virtual int CNPC::GetMagicAttPower(void);
	protected: void CNPC::SplashDamageAttack(int plusATTPowerPercent, short xPos, short yPos, short type, int range, unsigned long exceptAID);
	protected: void CNPC::OnMoveStop(int par1, int par2, int par3);
	protected: void CNPC::OnChangeAGI(int par1, int par2, int par3);
	protected: void CNPC::OnChangeDEX(int par1, int par2, int par3);
	protected: void CNPC::OnChangeINT(int par1, int par2, int par3);
	protected: void CNPC::OnChangeLUK(int par1, int par2, int par3);
	protected: void CNPC::OnChangeSTR(int par1, int par2, int par3);
	protected: void CNPC::OnChangeVIT(int par1, int par2, int par3);
	protected: void CNPC::InitThePCCacheInfo(int par1);
	protected: virtual short CNPC::GetAvoidPercent_Client(void);
	protected: unsigned long CNPC::GetRoomID(void);
	protected: void CNPC::SetRoomID(unsigned long roomID);

private:
	static hook_method<CNPC* (CNPC::*)(void)> CNPC::_CNPC;
	static hook_method<void (CNPC::*)(void)> CNPC::__CNPC;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetJobType;
	static hook_method<void (CNPC::*)(void)> CNPC::_Init;
	static hook_method<void (CNPC::*)(void)> CNPC::_InitTimeInfo;
	static hook_method<unsigned char (CNPC::*)(void)> CNPC::_GetNPCType;
	static hook_method<void (CNPC::*)(CCharacter* sender, CCharacter* attacker, CCharacter* target, int damage, short count, short level, unsigned short SKID)> CNPC::_NotifySkillAction;
	static hook_method<int (CNPC::*)(void)> CNPC::_IsSiegeMode;
	static hook_method<unsigned long (CNPC::*)(void)> CNPC::_GetAccountID;
	static hook_method<int (CNPC::*)(CCharacter* sender, CCharacter* receiver, unsigned long msgID, int par1, int par2, int par3, MSGpar::CVar par4)> CNPC::_OnMsg;
	static hook_method<int (CNPC::*)(unsigned short id, int& value)> CNPC::_GetParameterValue;
	static hook_method<int (CNPC::*)(unsigned short id, int value)> CNPC::_UpdateParameterValue;
	static hook_method<void (CNPC::*)(COMMAND_QUEUE* command)> CNPC::_InsertCommand;
	static hook_method<void (CNPC::*)(void)> CNPC::_CheckCommandQueue;
	static hook_method<void (CNPC::*)(unsigned long commandID)> CNPC::_DisableCommand;
	static hook_method<COMMAND_QUEUE* (CNPC::*)(unsigned long commandID)> CNPC::_SearchCommand;
	static hook_method<int (CNPC::*)(CCharacter* ch, int range)> CNPC::_IsMyArea;
	static hook_method<unsigned long (CNPC::*)(void)> CNPC::_GetState;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetScale;
	static hook_method<int (CNPC::*)(CCharacter* ch, unsigned long flag)> CNPC::_IsTarget;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetErrorCount;
	static hook_method<void (CNPC::*)(int i)> CNPC::_SetErrorCount;
	static hook_method<int (CNPC::*)(void)> CNPC::_IsDamageMotionPossible;
	static hook_method<int (CNPC::*)(int property)> CNPC::_IsRightProperty;
	static hook_method<int (CNPC::*)(void)> CNPC::_IsMovable;
	static hook_method<int (CNPC::*)(void)> CNPC::_IsAttackable;
	static hook_method<int (CNPC::*)(int race, int _class, int level)> CNPC::_IsAvoidable;
	static hook_method<void (CNPC::*)(int effect)> CNPC::_OnShowEffect;
	static hook_method<void (CNPC::*)(int effect, int numdata)> CNPC::_OnShowEffect3;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetEffectState;
	static hook_method<void (CNPC::*)(unsigned long in_loc, CITZMsg* flag)> CNPC::_OnMsgFromItemServer;
	static hook_method<short (CNPC::*)(CCharacter* other, int isRangeAttack)> CNPC::_GetAttackSuccessPercent;
	static hook_method<int (CNPC::*)(CCharacter* other, int plusATKPercent, int plusHITPercent, unsigned short SKID, int SKProperty, int isRNGATK)> CNPC::_GetAttackFinalDamage2;
   	static hook_method<int (CNPC::*)(ATTACK_INFO* info)> CNPC::_GetAttackFinalDamage;
	static hook_method<int (CNPC::*)(SKILLATTACK_MSG* msg, int plusATTPowerPercent, int plusATTSuccessPercent, const bool in_bHideSkill)> CNPC::_SkillAttack;
	static hook_method<short (CNPC::*)(int val1, short xPos, short yPos, int type, int range, int rangeIn, unsigned long exceptAID, void* msgDataPtr, int val2, int count)> CNPC::_SplashAttack;
	static hook_method<int (CNPC::*)(int plusATTPower, PosInfo dest, int type, int halfWidth, int height, MSG_TYPE1_TWODWORD* msgData, int count, int plusHitPercent, PosInfo* specialSrc)> CNPC::_SplashAttack2;
	static hook_method<int (CNPC::*)(int state, CCharacter* other, int percent, int preDelayTime, int delayTime, int isSpell, int isFixedDelayTime)> CNPC::_SetHandicapState;
	static hook_method<int (CNPC::*)(int index, int time, int val1, int val2, int val3, int isSendClient)> CNPC::_SetEffective;
	static hook_method<void (CNPC::*)(int index, int val)> CNPC::_ResetEffective;
	static hook_method<void (CNPC::*)(const int in_plusATTPower, const CCharacter* in_srcCH, const CCharacter* in_otherCH, const int in_destDir, const unsigned short in_SKID, const int in_DistCellFactor, mystd::map<CCharacter *,CollideInfo>& io_collidedList)> CNPC::_CollideSplashAttack;
	static hook_method<bool (CNPC::*)(int index, int& SKID, bool& isPlaySolo)> CNPC::_IsGroundEffective;
	static hook_method<void (CNPC::*)(int par1, int par2, bool par3)> CNPC::_ProcessGroundEffective;
	static hook_method<void (CNPC::*)(int value)> CNPC::_SetOnShowEFST;
	static hook_method<void (CNPC::*)(int value)> CNPC::_SetOffShowEFST;
	static hook_method<void (CNPC::*)(int in_SKLevel, unsigned short in_EFST, unsigned long in_EFST_time, int in_EFST_value)> CNPC::_OnChangeStatusAmount;
	static hook_method<void (CNPC::*)(unsigned short type, int amount)> CNPC::_NotifyStatusAmount;
	static hook_method<char (CNPC::*)(void)> CNPC::_GetCampID;
	static hook_method<void (CNPC::*)(char campID)> CNPC::_SetCampID;
	static hook_method<const char* (CNPC::*)(void)> CNPC::_GetNamePtr;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetHealthState;
	static hook_method<void (CNPC::*)(short state)> CNPC::_ResetHealthState;
	static hook_method<void (CNPC::*)(unsigned long time, int state)> CNPC::_SetEffectStateTimeInfo;
	static hook_method<void (CNPC::*)(int state)> CNPC::_ResetEffectState;
	static hook_method<void (CNPC::*)(int state)> CNPC::_SetEffectState;
	static hook_method<void (CNPC::*)(void)> CNPC::_Reset;
	static hook_method<void (CNPC::*)(unsigned long killer)> CNPC::_OnDead;
	static hook_method<void (CNPC::*)(const int in_Length, char* in_pBuffer)> CNPC::_Send;
	static hook_method<void (CNPC::*)(unsigned short SKID, unsigned short NUM, bool result, unsigned char cause)> CNPC::_SkillUseAck;
	static hook_method<void (CNPC::*)(void)> CNPC::_OnProcess;
	static hook_method<int (CNPC::*)(CCharacter* other, unsigned short SKID, int property)> CNPC::_GetAttackPoint;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetSpeed;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetAvoidableSuccessPercent;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetStatusDef;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetDefencePoint;
	static hook_method<int (CNPC::*)(int value)> CNPC::_GetModifiedValueByEnemySize;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetItemMagicDef;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetStatusMagicDef;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetMaxHP;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetMaxSP;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetDexValue;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetIntValue;
	static hook_method<int (CNPC::*)(void)> CNPC::_IsRechargeTime;
	static hook_method<void (CNPC::*)(CCharacter* ch, int attackProperty, int& damage)> CNPC::_ModifyAttackPowerByEffective;
	static hook_method<unsigned short (CNPC::*)(int percent)> CNPC::_GetLostItem;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetATKHasteVal1;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetATKHasteVal2;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetAttackSlowValue;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetMoveHasteValue;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetMoveSlowValue;
	static hook_method<void (CNPC::*)(unsigned long AID)> CNPC::_SetParentAID;
	static hook_method<unsigned long (CNPC::*)(void)> CNPC::_GetParentAID;
	static hook_method<void (CNPC::*)(int flag)> CNPC::_SetRegen;
	static hook_method<int (CNPC::*)(void)> CNPC::_IsRegen;
	static hook_method<char* (CNPC::*)(void)> CNPC::_GetAccountName;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetAttackRange;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetRevivalTerm;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetAttackMotionTime;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetAttackedMotionTime;
	static hook_method<int (CNPC::*)(void)> CNPC::_IsCritical;
	static hook_method<NpcInfo* (CNPC::*)(void)> CNPC::_GetCharacterInfo;
	static hook_method<unsigned long (CNPC::*)(void)> CNPC::_GetCurrentFSMState;
	static hook_method<void (CNPC::*)(unsigned long state)> CNPC::_SetCurrentFSMState;
	static hook_method<void (CNPC::*)(unsigned short SKID, int skLevel, int targetAID, int xPos, int yPos)> CNPC::_OnUseSkill;
	static hook_method<CCharacter* (CNPC::*)(void)> CNPC::_GetTarget;
	static hook_method<void (CNPC::*)(int flag)> CNPC::_SetFSMDependent;
	static hook_method<int (CNPC::*)(void)> CNPC::_IsFSMDependent;
	static hook_method<void (CNPC::*)(void)> CNPC::_StopMove;
	static hook_method<int (CNPC::*)(int range)> CNPC::_IsMovableAround;
	static hook_method<unsigned long (CNPC::*)(void)> CNPC::_GetEnemyAID;
	static hook_method<void (CNPC::*)(unsigned long AID)> CNPC::_SetEnemyAID;
	static hook_method<void (CNPC::*)(short state)> CNPC::_SetBodyState;
	static hook_method<void (CNPC::*)(short state)> CNPC::_SetHealthState;
	static hook_method<void (CNPC::*)(short state)> CNPC::_SetCurrentState;
	static hook_method<void (CNPC::*)(int speed)> CNPC::_SetSpeed;
	static hook_method<void (CNPC::*)(void)> CNPC::_SetZenyLost;
	static hook_method<int (CNPC::*)(void)> CNPC::_IsZenyLost;
	static hook_method<int (CNPC::*)(void* p)> CNPC::_InitByPacket;
	static hook_method<int (CNPC::*)(int AID)> CNPC::_SetAccountID;
	static hook_method<bool (CNPC::*)(const char* map_name)> CNPC::_RegistBattleFiledNpc;
	static hook_method<int (CNPC::*)(const char camp_code)> CNPC::_GetBattleFieldAliveMemberCount;
	static hook_method<void (CNPC::*)(void)> CNPC::_KVM_StartAliveCheck;
	static hook_method<void (CNPC::*)(const char* sw)> CNPC::_KVM_Npc_Noti;
	static hook_method<void (CNPC::*)(void)> CNPC::_InitSkill;
	static hook_method<void (CNPC::*)(int closeType, int killer)> CNPC::_Dump;
	static hook_method<void (CNPC::*)(int type)> CNPC::_OnEmotion;
	static hook_method<void (CNPC::*)(unsigned long sprite)> CNPC::_ChangeSprite;
	static hook_method<int (CNPC::*)(int GuildID)> CNPC::_IsSameGuild;
	static hook_method<void (CNPC::*)(void)> CNPC::_Revival;
	static hook_method<void (CNPC::*)(void)> CNPC::_CancelNPCSkill;
	static hook_method<void (CNPC::*)(bool value, unsigned long id)> CNPC::_SetRangedAttacked;
	static hook_method<void (CNPC::*)(bool value, unsigned long id)> CNPC::_SetRudeAttacked;
	static hook_method<void (CNPC::*)(unsigned long skillID)> CNPC::_SetAttackedSkillID;
	static hook_method<void (CNPC::*)(int par1, int par2, int par3)> CNPC::_OnTeleportCharacter;
	static hook_method<void (CNPC::*)(int SKID, int tarAID, int SKInfo)> CNPC::_OnGroundSkill;
	static hook_method<void (CNPC::*)(int tarAID, int SKInfo, int par1)> CNPC::_OnTouchedSkillObject;
	static hook_method<void (CNPC::*)(int SKID, int tarAID, int SKInfo)> CNPC::_OperationSkillToCharacter;
	static hook_method<void (CNPC::*)(int SKID, int tarAID, int SKInfo)> CNPC::_SPAttackSkillToCharacter;
	static hook_method<void (CNPC::*)(int SKID, int tarAID, int SKInfo)> CNPC::_OperationSkillToSelf;
	static hook_method<void (CNPC::*)(int plusATTPower, PosInfo dest, int type, MSG_TYPE1_TWODWORD* msgData, int range, int count)> CNPC::_SplashAttack3;
	static hook_method<void (CNPC::*)(SKILLATTACK_MSG* msg, short xPos, short yPos, int range, unsigned long exceptID)> CNPC::_SplashNapalmBeat;
	static hook_method<void (CNPC::*)(int xPos, int yPos, int destDir, int distance, PosInfo& result)> CNPC::_GetPushedPosition2;
	static hook_method<void (CNPC::*)(PosInfo src, PosInfo dest, int halfWidth, int height, PosInfo* result)> CNPC::_GetSplashCells;
	static hook_method<void (CNPC::*)(PosInfo src, PosInfo dest, int height, PosInfo* result)> CNPC::_GetSplashCells2;
	static hook_method<int (CNPC::*)(short srcX, short srcY, int desX, int desY, int* result)> CNPC::_GetFireWallNeighborCells;
	static hook_method<void (CNPC::*)(unsigned short SKID, unsigned long targetAID, unsigned long srcAID, short level, bool result)> CNPC::_NotifyUseSkill;
	static hook_method<void (CNPC::*)(unsigned short SKID, short level, short xPos, short yPos, unsigned long startTime)> CNPC::_NotifyGroundSkillUsing;
	static hook_method<void (CNPC::*)(int range, SKILLATTACK_MSG* msg, int plusAttPower, int deltaX, int deltaY)> CNPC::_DetectHidingCharacter;
	static hook_method<void (CNPC::*)(SummonMobList* summonMobList, unsigned short skillID, int slaveFlag, int posFlag)> CNPC::_SummonMonster;
	static hook_method<void (CNPC::*)(SummonMobList* summonMobList)> CNPC::_Metamorphosis;
	static hook_method<CCharacter* (CNPC::*)(unsigned long spriteType, int slaveFlag, int posFlag)> CNPC::_AddMonster;
	static hook_method<void (CNPC::*)(int& damage, int isRangeAttack, int attackType, CCharacter* other, unsigned short SKID)> CNPC::_ModifyDamage;
	static hook_method<void (CNPC::*)(CCharacter* other, int& damage, int isRNGATK, int type, int property, int SKID)> CNPC::_ModifyDamage_ATKED;
	static hook_method<void (CNPC::*)(unsigned short SKID, unsigned long targetAID, unsigned long srcAID, int damage)> CNPC::_NotifyMissSkill;
	static hook_method<void (CNPC::*)(int val1, short xPos, short yPos, int type, int range, int rangeIn, unsigned long exceptAID, MSG_TYPE1_TWODWORD* msgData, int val2, int count)> CNPC::_NeighborPCAttack;
	static hook_method<void (CNPC::*)(void)> CNPC::_Enable;
	static hook_method<void (CNPC::*)(void)> CNPC::_Disable;
	static hook_method<int (CNPC::*)(void)> CNPC::_IsEnable;
	static hook_method<void (CNPC::*)(int defense, int isInit)> CNPC::_OnChangeDefense;
	static hook_method<int (CNPC::*)(void)> CNPC::_SetParameter;
	static hook_method<void (CNPC::*)(void)> CNPC::_InitCache;
	static hook_method<void (CNPC::*)(void)> CNPC::_OnChangeGuildID;
	static hook_method<void (CNPC::*)(int SKID, unsigned long time, int val)> CNPC::_SetATKPercentInfo;
	static hook_method<void (CNPC::*)(int SKID, unsigned long time, int val)> CNPC::_SetDEFPercentInfo;
	static hook_method<void (CNPC::*)(int SKID)> CNPC::_ResetATKPercentInfo;
	static hook_method<void (CNPC::*)(int SKID)> CNPC::_ResetDEFPercentInfo;
	static hook_method<void (CNPC::*)(int SKID, unsigned long time, int val)> CNPC::_SetMATKPercentInfo;
	static hook_method<void (CNPC::*)(int SKID, unsigned long time, int val)> CNPC::_SetMDEFPercentInfo;
	static hook_method<void (CNPC::*)(int SKID)> CNPC::_ResetMATKPercentInfo;
	static hook_method<void (CNPC::*)(int SKID)> CNPC::_ResetMDEFPercentInfo;
	static hook_method<unsigned short (CNPC::*)(void)> CNPC::_GetSpellCasting;
	static hook_method<int (CNPC::*)(const char* mobName)> CNPC::_OnWhereMyMob_XPos;
	static hook_method<int (CNPC::*)(const char* mobName)> CNPC::_OnWhereMyMob_YPos;
	static hook_method<unsigned long (CNPC::*)(const char* mobName)> CNPC::_FindMyMobAID;
	static hook_method<void (CNPC::*)(const unsigned short in_SKID)> CNPC::_SetSpellCasting;
	static hook_method<int (CNPC::*)(const int in_SKID)> CNPC::_GetSKLevel;
	static hook_method<bool (CNPC::*)(CCharacter* in_TargetCH, MSG_TYPE4_FIVEDWORD* in_pData)> CNPC::_OpSKToChar_SKID_ML_DEVOTION;
	static hook_method<void (CNPC::*)(const int in_SKlevel)> CNPC::_OpSKToSelf_SKID_ML_DEFENDER;
	static hook_method<void (CNPC::*)(const int in_SKLevel, const int in_EFST, const int in_EFST_time, const int in_EFST_value)> CNPC::_OpSKToSelf_SKID_MER_MAGNIFICAT;
	static hook_method<void (CNPC::*)(void)> CNPC::_OpSKToSelf_SKID_MER_AUTOBERSERK;
	static hook_method<void (CNPC::*)(unsigned short type, int count)> CNPC::_NotifyParameter;
	static hook_method<void (CNPC::*)(void)> CNPC::_ResetEffective_after_EFST_DEFENDER;
	static hook_method<void (CNPC::*)(int SKID, MSG_TYPE1_TWODWORD* position, int skLevel, int spCost)> CNPC::_OnUseGroundSkill;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetEmblemVersion;
	static hook_method<unsigned long (CNPC::*)(int range)> CNPC::_GetNeighborPcNumber;
	static hook_method<void (CNPC::*)(unsigned long tick)> CNPC::_CheckSpecialState;
	static hook_method<void (CNPC::*)(unsigned long tick)> CNPC::_CheckCondition;
	static hook_method<CItem* (CNPC::*)(unsigned short itmID, int count, int x, int y)> CNPC::_CreateItemOnMap;
	static hook_method<void (CNPC::*)(unsigned long AID)> CNPC::_AddSpecialZoneList;
	static hook_method<void (CNPC::*)(void)> CNPC::_DelSpecialZoneList;
	static hook_method<bool (CNPC::*)(unsigned short type, int& amount)> CNPC::_ApplyStatusAmount;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetBodyState;
	static hook_method<void (CNPC::*)(const char* buf, unsigned long color)> CNPC::_Chat;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetAttSucPercent;
	static hook_method<int (CNPC::*)(CCharacter* target)> CNPC::_GetModifiedTargetStatusDEF;
	static hook_method<void (CNPC::*)(int& def, CCharacter* in_cpAtkerCH)> CNPC::_ApplyExtraDEF;
	static hook_method<void (CNPC::*)(int& mdef)> CNPC::_ApplyExtraMDEF;
	static hook_method<int (CNPC::*)(CCharacter* atker, int damage, unsigned short SKID, int property)> CNPC::_GetMinusStdPropertyDamage;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetRoomSize;
	static hook_method<void (CNPC::*)(void)> CNPC::_InitCore;
	static hook_method<void (CNPC::*)(unsigned long AID)> CNPC::_AddMYMob;
	static hook_method<void (CNPC::*)(unsigned long AID, unsigned long killer)> CNPC::_OnMyMonsterDead;
	static hook_method<int (CNPC::*)(PACKET_CZ_REQUEST_MOVE* pReq, unsigned long startTime)> CNPC::_StartPath;
	static hook_method<int (CNPC::*)(PACKET_CZ_REQUEST_MOVE* p)> CNPC::_OnMove;
	static hook_method<void (CNPC::*)(void)> CNPC::_MultiCastStateInfo;
	static hook_method<void (CNPC::*)(void)> CNPC::_NotifyInfoToSection;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetCurrentState;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetMYMobSize;
	static hook_method<int (CNPC::*)(unsigned long spriteType)> CNPC::_SpawnMyMob;
	static hook_method<void (CNPC::*)(void)> CNPC::_OnResetMyMob;
	static hook_method<void (CNPC::*)(int SKID, int tarAID, int SKInfo)> CNPC::_UseSkillToCharacter;
	static hook_method<int (CNPC::*)(CCharacter* other, int plusATTPowerPercent, int plusATTSuccessPercent, unsigned short SKID)> CNPC::_GetMagicAttackFinalDamage;
	static hook_method<int (CNPC::*)(void)> CNPC::_GetMagicAttPower;
	static hook_method<void (CNPC::*)(int plusATTPowerPercent, short xPos, short yPos, short type, int range, unsigned long exceptAID)> CNPC::_SplashDamageAttack;
	static hook_method<void (CNPC::*)(int par1, int par2, int par3)> CNPC::_OnMoveStop;
	static hook_method<void (CNPC::*)(int par1, int par2, int par3)> CNPC::_OnChangeAGI;
	static hook_method<void (CNPC::*)(int par1, int par2, int par3)> CNPC::_OnChangeDEX;
	static hook_method<void (CNPC::*)(int par1, int par2, int par3)> CNPC::_OnChangeINT;
	static hook_method<void (CNPC::*)(int par1, int par2, int par3)> CNPC::_OnChangeLUK;
	static hook_method<void (CNPC::*)(int par1, int par2, int par3)> CNPC::_OnChangeSTR;
	static hook_method<void (CNPC::*)(int par1, int par2, int par3)> CNPC::_OnChangeVIT;
	static hook_method<void (CNPC::*)(int par1)> CNPC::_InitThePCCacheInfo;
	static hook_method<short (CNPC::*)(void)> CNPC::_GetAvoidPercent_Client;
	static hook_method<unsigned long (CNPC::*)(void)> CNPC::_GetRoomID;
	static hook_method<void (CNPC::*)(unsigned long roomID)> CNPC::_SetRoomID;

	friend class CCharacterMgr;
	friend class CNPCUpdater;
	friend class CNPCStateUpdater;
	friend class CPCClientUpdater;
};


int __cdecl IsEventNpc(char type);
